// 入口sink，可以add数据，然后交给Stream Controller处理，输出Stream 被监听
/*
  流的分类：
  1.单向流：单个订阅流在流的整个生命周期内仅允许有一个listener。它在有收听者之前不会生成事件，并且在取消收听时它会停止发送事件，即使你仍然在Sink.add更多事件
  2.广播流：广播流允许任意数量的收听者，且无论是否有收听者，他都能产生事件。所以中途进来的收听者将不会收到之前的消息。
 */
import 'dart:async';

void main() {
  // 1. createStream();
  // 2. testStreamController();
  /* 3. countStream(10).listen((event) {
    print('event = $event');
  });*/
  // 4. testTransformStream();
}

void createStream() {
  final stream = Stream.fromIterable([1, 2, 3]);

  // 使用await for:它 能够在每个事件到来的时候处理它
  sumStream(stream).then((value) => print('sumStream = $value'));

  // 使用listen监听Stream
  /*stream.listen((event) {
    print('listen:$event');
  }, onDone: () {
    print('onDone');
  });*/
}

Future<int> sumStream(Stream<int> stream) async {
  var sum = 0;
  await for (var i in stream) {
    sum += i;
  }
  return sum;
}

// 使用StreamController
void testStreamController() {
  StreamController sc = StreamController();
  // 监听
  /*StreamSubscription subscription = */
  sc.stream.listen((event) {
    print('$event');

    sc.close();
  });

  // 输入数据
  sc.sink.add(123);
}

// 使用async*-yield 生成Stream，当循环退出时，Stream则done
Stream<int> countStream(int count) async* {
  for (int i = 1; i <= count; i++) {
    yield i;
  }
}

// 流转换
void testTransformStream() {
  StreamController controller = StreamController<int>();

  // 将int类型的Stream转换为String类型
  final StreamTransformer transformer =
      StreamTransformer<int, String>.fromHandlers(handleData: (data, sink) {
    if (data == 100) {
      sink.add("回答正确");
    } else {
      sink.addError('回答错误');
    }
  });
  controller.stream.transform(transformer).listen((event) {
    print('event = $event');
    controller.close();
  });

  controller.sink.add(1);
}
